﻿
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using Studio7i.CapaDominio;

namespace Studio7i.CapaPersistencia.DAO
{
    public class ServicioDAO : IServicioDAO
    {
        // Métodos CRUD
        /**********************************************************************************************************/
        public Servicio Crear(Servicio ServicioACrear)
        {
            string _Sentencia = "INSERT INTO Servicio_Adicional VALUES(@codigo, @nombre , @descripcion,@costo)";
            int _NuevoCodigo = GenerarNuevoCodigo();
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", _NuevoCodigo));
                    _Comando.Parameters.Add(new SqlParameter("@nombre", ServicioACrear.nombre));
                    _Comando.Parameters.Add(new SqlParameter("@descripcion", ServicioACrear.descripcion));
                    _Comando.Parameters.Add(new SqlParameter("@costo", ServicioACrear.costoServicio));

                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(_NuevoCodigo);
            //return ServicioACrear;
        }

        /**********************************************************************************************************/
        public Servicio Obtener(int codigo)
        {
            string _Sentencia = "SELECT CoServicio, NoServicio, TxDescripcion , SsServicio FROM Servicio_Adicional WHERE CoServicio=@codigo";
            Servicio servicioCreado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", codigo));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        if (_Resultado.Read())
                        {
                            servicioCreado = new Servicio();
                            servicioCreado.codigo = (int)_Resultado["CoServicio"];
                            servicioCreado.nombre = (String)_Resultado["NoServicio"];
                            servicioCreado.costoServicio = (decimal)_Resultado["SsServicio"];
                            servicioCreado.descripcion = (String)_Resultado["TxDescripcion"];
                        }
                    }
                }
            }
            return servicioCreado;
        }

        /**********************************************************************************************************/
        public Servicio Modificar(Servicio servicioAModificar)
        {
            string _Sentencia = "UPDATE Servicio_Adicional SET Noservicio=@nombre, TxDescripcion=@descripcion, SsServicio=@costo  WHERE CoServicio=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", servicioAModificar.codigo));
                    _Comando.Parameters.Add(new SqlParameter("@nombre", servicioAModificar.nombre));
                    _Comando.Parameters.Add(new SqlParameter("@descripcion", servicioAModificar.descripcion));
                    _Comando.Parameters.Add(new SqlParameter("@costo", servicioAModificar.costoServicio));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(servicioAModificar.codigo);
        }

        /**********************************************************************************************************/
        public void Eliminar(Servicio servicioAEliminar)
        {
            string _Sentencia = "DELETE FROM Servicio_Adicional WHERE CoServicio=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", servicioAEliminar.codigo));
                    _Comando.ExecuteNonQuery();
                }
            }
        }

        /**********************************************************************************************************/
        // Métodos Listar
        public ICollection<Servicio> ListarTodos()
        {
            string _Sentencia = "SELECT CoServicio, Noservicio, SsServicio, TxDescripcion FROM Servicio_Adicional";
            ICollection<Servicio> serviciosEncontrados = new List<Servicio>();
            Servicio servicioEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            servicioEncontrado = new Servicio();
                            servicioEncontrado.codigo = (int)_Resultado["CoServicio"];
                            servicioEncontrado.nombre = (String)_Resultado["NoServicio"];
                            servicioEncontrado.descripcion = (String)_Resultado["TxDescripcion"];
                            servicioEncontrado.costoServicio = (decimal)_Resultado["SsServicio"];
                            serviciosEncontrados.Add(servicioEncontrado);
                        }
                    }
                }
            }
            return serviciosEncontrados;
        }

        /**********************************************************************************************************/
        public ICollection<Servicio> ListarXNombre(string nombre)
        {
            string _Sentencia = "SELECT CoServicio, NoServicio, TxDescripcion, SsServicio FROM Servicio_Adicional WHERE NoServicio LIKE '%'+@nombre+'%'";
            ICollection<Servicio> serviciosEncontrados = new List<Servicio>();
            Servicio servicioEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@nombre", nombre));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            servicioEncontrado = new Servicio();
                            servicioEncontrado.codigo = (int)_Resultado["CoServicio"];
                            servicioEncontrado.nombre = (String)_Resultado["NoServicio"];
                            servicioEncontrado.descripcion = (String)_Resultado["TxDescripcion"];
                            servicioEncontrado.costoServicio = (decimal)_Resultado["SsServicio"];
                            serviciosEncontrados.Add(servicioEncontrado);
                        }
                    }
                }
            }
            return serviciosEncontrados;
        }

        /**********************************************************************************************************/
        // Métodos de soporte
        private int GenerarNuevoCodigo()
        {
            string _Sentencia = "SELECT max(CoServicio) FROM Servicio_Adicional";
            int _NuevoCodigo = 0;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    object _Resultado = _Comando.ExecuteScalar();
                    if (DBNull.Value.Equals(_Resultado)) // No hay datos en la tabla
                        _NuevoCodigo = 1;
                    else
                        _NuevoCodigo = (int)_Resultado + 1;
                }
            }
            return _NuevoCodigo;
        }
    }
}
